#ifndef ETAT_H_
#define ETAT_H_

#include <map>
#include <string>
#include <iostream>

class Etat;
class Robot;

#include "Position.h"
#include "Direction.h"
#include "MauvaisEtat.h"


class Etat {
	
	private:
		static std::map<std::string, Etat*> *mapEtats;
		static std::map<std::string, Etat*>* getMapEtats()
		{
			if (!mapEtats)
				mapEtats = new std::map<std::string, Etat*>();
			return mapEtats;
		}
	
	public:
		/**
		 * construit un Etat
		 */
		Etat(std::string t) 
		{
			(*getMapEtats())[t] = this;
		}
		
		virtual ~Etat() {}
		virtual void avancer(Position &p) {throw MauvaisEtat("Le robot ne peut pas avancer");}
		virtual void tourner(Direction &direction) {throw MauvaisEtat("Le robot ne peut pas tourner");}
		virtual void saisir() {throw MauvaisEtat("Le robot ne peut pas saisir d'objet");}
		virtual void poser() {throw MauvaisEtat("Le robot ne peut pas poser d'objet");}
		virtual void peserObjet() {throw MauvaisEtat("Le robot ne peut pas peser d'objet");}
		virtual void evaluerObstacle() {throw MauvaisEtat("Le robot ne peut pas evaluer d'obstacle");}
		virtual void arreter() {throw MauvaisEtat("Le robot ne peut pas s'arrêter");}
		virtual void repartir() {throw MauvaisEtat("Le robot ne peut pas repartir");}
		virtual std::string getTag() = 0;
		static Etat* getEtat(std::string nom){return (*getMapEtats())[nom];}
};

#endif /*ETAT_H_*/
